home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Fichero: PERSP.ASM
- ;
- ; Versi≤n: 1.0
- ; Autor: Antonio M. EstΘvez Lorenzo
- ; Prop≤sito: Dibuja superficies
- ;
- ; Para ensamblar: TASM /ml [/dc87] superf
- ; /ml -> Sensible a may·sculas/min·sculas
- ; /dc87 -> Define la constante c87 (parßmetro opcional)
- ; Si no se incluye se emplerßn instruciones de
- ; emulaci≤n de coprocesador
-
-
- .MODEL large,Pascal
-
- LOCALS @@
-
- .286
-
- ifdef c87
- .287
- elseifdef C87
- .287
- else
- EMUL
- endif
-
- EXTRN C sin: PROC
- EXTRN C cos: PROC
- EXTRN Pascal @TSuperf@CalcCoord$qv: PROC
- EXTRN Pascal LINETO: PROC
- EXTRN Pascal MOVETO: PROC
- EXTRN Pascal POLYLINE: PROC
- EXTRN Pascal SETPIXEL: PROC
- EXTRN Pascal SELECTOBJECT: PROC
- EXTRN Pascal CREATEPEN: PROC
- .CONST
-
- cteRad DQ 0.017453292519943296
- cte360 DD 360.0
- cteEnt DW 1F3FH
-
- .DATA
-
- Variables= 2
-
- DatTmp LABEL BYTE
- DatModif DW ?
- ErrorDat DW ?
- AngGiro DW ?
- IntvGiro DW ?
- NodosX DW ?
- NodosY DW ?
- OrgX DW ?
- OrgY DW ?
- Persp DW ?
- Rotar DW ?
- Dibujar DW ?
- MatGiro DW ?
- EscX DQ ?
- EscY DQ ?
- EscZ DQ ?
- SinXZ DQ ?
- CosXZ DQ ?
- SinYZ DQ ?
- CosYZ DQ ?
- CoefRedZ DQ ?
- MatCos DQ 9 DUP(?)
- MatSen DQ 9 DUP(?)
- OrgEjeX DQ ?
- OrgEjeY DQ ?
- OrgEjeZ DQ ?
- CoordX DD ?
- CoordY DD ?
- CoordZ DD ?
- Tmp DQ ?
- OfsAngGiro EQU Variables+OFFSET AngGiro-OFFSET DatTmp
-
- TmpX DQ ?
- TmpY DQ ?
- TmpZ DQ ?
-
- PuntoX DW ?
- PuntoY DW 401 DUP(?)
- RMatGiro DQ 9 DUP(?)
-
- ContX DW ?
- ContY DW ?
- DirCoord DW ?
-
- SinZ DQ ?
- CosZ DQ ?
- CosZX DQ ?
- SinZX DQ ?
- CosZY DQ ?
- SinZY DQ ?
- CosZZ DQ ?
- SinZZ DQ ?
-
- RotaX DW ?
- RotaY DW ?
-
- Sumar MACRO Oper
- FADDP Oper
- ENDM
-
- Restar MACRO Oper
- FSUBP Oper
- ENDM
-
- Multp MACRO Oper
- FMUL Oper
- ENDM
-
- Round MACRO Dest
- FISTP Dest
- ENDM
-
- LDReal MACRO Ofs
- FLD Ofs
- ENDM
-
- LDCoor MACRO Tipo
- LES BX,Coord&Tipo&
- ADD BX,DI
- FLD DWORD PTR ES:[BX]
- ENDM
-
- SVCoor MACRO Tipo
- LES BX,Coord&Tipo&
- ADD BX,DI
- FSTP DWORD PTR ES:[BX]
- ENDM
-
- Escala MACRO Coor
- LDCoor Coor
- Multp Esc&Coor&
- ENDM
-
- SigPunto MACRO
- ADD DI,DWORD
- ENDM
-
- ProcPersp MACRO CoorX,CoorY,OperX,OperY
- Escala Z
- Escala Y
- Escala X
-
- CALL Rotar
-
- IFDIF <CoorX>,<0>
- FXCH ST(CoorX)
- ENDIF
- Round RotaX
- IFDIF <CoorY-1>,<0>
- FXCH ST(CoorY-1)
- ENDIF
- Round RotaY
- FWAIT
- FSTP Tmp
-
- MOV CX,OrgX
- OperX CX,RotaX
- MOV DX,OrgY
- OperY DX,RotaY
- ENDM
-
- MulMat MACRO Pos
- FLD QWORD PTR [BX+(Pos-1)*QWORD*3]
- FMUL TmpX
- FLD QWORD PTR [BX+(Pos-1)*QWORD*3+QWORD]
- FMUL TmpY
- FADDP
- FLD QWORD PTR [BX+(Pos-1)*QWORD*3+QWORD*2]
- FMUL TmpZ
- FADDP
- ENDM
-
- CalcAng MACRO Ang,Eje
- FILD Ang
- Multp cteRad
- SUB SP,8
- MOV BX,SP
- FSTP QWORD PTR SS:[BX]
- CALL sin
- FSTP SinZ&Eje&
- CALL cos
- FSTP CosZ&Eje&
- ADD SP,8
- ENDM
-
- Gira MACRO Eje
- MOV AX,Ang&Eje&
- OR AL,AL
- JZ @@No&Eje&
- FLD CosZ&Eje&
- FSTP CosZ
- FLD SinZ&Eje&
- FSTP SinZ
- CALL RotaEje&Eje&
- @@No&Eje&:
- ENDM
-
- .CODE
-
- RotaEjeX PROC NEAR
- FLD ST(1)
- Multp CosZ
- FXCH ST(2)
- Multp SinZ
-
- FLD ST(3)
- Multp SinZ
- FXCH ST(4)
- Multp CosZ
-
- FADDP
- FXCH ST(3)
- FSUBP ST(2)
- RET
- RotaEjeX ENDP
-
- RotaEjeY PROC NEAR
- FLD ST(2)
- Multp CosZ
- FXCH ST(3)
- Multp SinZ
-
- FLD ST(1)
- Multp SinZ
- FXCH ST(2)
- Multp CosZ
-
- FADDP
- FXCH ST(3)
- FSUBRP
- FXCH ST(2)
- RET
- RotaEjeY ENDP
-
- RotaEjeZ PROC NEAR
- FLD ST(0)
- Multp CosZ
- FXCH ST(1)
- Multp SinZ
-
- FLD ST(2)
- Multp SinZ
- FXCH ST(3)
- Multp CosZ
-
- FADDP
- FXCH ST(2)
- FSUBP
- RET
- RotaEjeZ ENDP
-
- RotaEje1 PROC NEAR
- FSTP TmpX
- FSTP TmpY
- FSTP TmpZ
- MultMat: MOV BX,OFFSET RMatGiro
- MulMat 1
- MulMat 2
- MulMat 3
- FXCH ST(2)
- RET
- RotaEje1 ENDP
-
- RotaEje2 PROC NEAR
- LDReal OrgEjeX
- Multp EscX
- FXCH ST(1)
- FSUB ST,ST(1)
- FSTP TmpX
- LDReal OrgEjeY
- Multp EscY
- FXCH ST(2)
- FSUB ST,ST(2)
- FSTP TmpY
- LDReal OrgEjeZ
- Multp EscZ
- FXCH ST(3)
- FSUB ST,ST(3)
- FSTP TmpZ
- CALL MultMat
- FADDP ST(3),ST
- FADDP ST(3),ST
- FADDP ST(3),ST
- RET
- RotaEje2 ENDP
-
- Axonom PROC NEAR
- Escala Z
- Escala Y
- Escala X
- CALL Rotar
-
- FLD ST(0)
- Multp CosXZ
- FLD ST(2)
- Multp CosYZ
- Restar
- Round RotaX
-
- Multp SinXZ
- FXCH ST(1)
- Multp SinYZ
- Sumar
- FXCH ST(1)
- Multp CoefRedZ
- Restar
- Round RotaY
- FWAIT
-
- MOV CX,OrgX
- SUB CX,RotaX
- MOV DX,RotaY
- ADD DX,OrgY
- SigPunto
- RET
- Axonom ENDP
-
- Alzado PROC NEAR
- ProcPersp 0,2,SUB,SUB
- SigPunto
- RET
- Alzado ENDP
-
- Perfil PROC NEAR
- ProcPersp 1,2,ADD,SUB
- SigPunto
- RET
- Perfil ENDP
-
- Planta PROC NEAR
- ProcPersp 0,1,SUB,ADD
- SigPunto
- RET
- Planta ENDP
-
-
- GradToRad PROC C Num: QWORD
- PUBLIC C GradToRad
- FLD Num
- FLD cte360
- FDIVR ST,ST(1)
- FSTCW ContX
- FLDCW cteEnt
- FRNDINT
- FLDCW ContX
- FMUL cte360
- FSUBP
- Multp cteRad
- RET
- GradToRad ENDP
-
-
- InitMatGiro PROC NEAR
- XOR BX,BX
- MOV CL,3
- @@0: MOV CH,3
- @@1: CMP CH,CL
- JE @@2
- LDReal [BX].MatSen
- Multp SinZ
- JMP SHORT @@3
- @@2: FLD1
- @@3: LDReal CosZ
- FLD1
- Restar
- Multp [BX].MatCos
- Sumar
- FSTP QWORD PTR [BX].RMatGiro
- ADD BX,QWORD
- DEC CH
- JNZ @@1
- DEC CL
- JNZ @@0
- NoInit: RET
- InitMatGiro ENDP
-
- InitProc PROC C tpPersp: WORD, tpRotar: WORD, tpDibujo: WORD, tpEje: WORD, \
- dPersp: DWORD, dRotar: DWORD, dDibujo: DWORD, dMatGiro: DWORD
- PUBLIC C InitProc
- MOV DX,tpPersp
- MOV AX,OFFSET Alzado
- CMP DL,1
- JZ @@1
- MOV AX,OFFSET Perfil
- CMP DL,2
- JZ @@1
- MOV AX,OFFSET Planta
- CMP DL,3
- JZ @@1
- MOV AX,OFFSET Axonom
- @@1: LES BX,dPersp
- MOV ES:[BX],AX
- MOV DX,tpRotar
- MOV CX,OFFSET NoInit
- MOV AX,OFFSET RotaEjeX
- OR DL,DL
- JZ @@2
- MOV AX,OFFSET RotaEjeY
- CMP DL,1
- JZ @@2
- MOV AX,OFFSET RotaEjeZ
- CMP DL,2
- JZ @@2
- MOV CX,OFFSET InitMatGiro
- MOV AX,OFFSET RotaEje1
- CMP tpEje,0
- JNZ @@2
- MOV AX,OFFSET RotaEje2
- @@2: LES BX,dRotar
- MOV ES:[BX],AX
- LES BX,dMatGiro
- MOV ES:[BX],CX
- MOV AX,tpDibujo
- MOV CX,OFFSET DibPuntos
- CMP AX,1
- JZ @@3
- MOV CX,OFFSET DibIntvX
- CMP AX,2
- JZ @@3
- MOV CX,OFFSET DibIntvY
- CMP AX,3
- JZ @@3
- MOV CX,OFFSET DibMalla
- @@3: LES BX,dDibujo
- MOV ES:[BX],CX
- RET
- InitProc ENDP
-
- @TSuperf@GiroInicial$qiiii PROC AngX: WORD, AngY: WORD, AngZ: WORD, \
- CalcDat: WORD, @Self: DWORD
- PUBLIC @TSuperf@GiroInicial$qiiii
- PUSH DI
- CMP CalcDat,0
- JNZ @@1
- JMP @@2
- @@1: CalcAng AngX,X
- CalcAng AngY,Y
- CalcAng AngZ,Z
- MOV DirCoord,0
- @@2: MOV DI,DirCoord
- LDCoor Z
- LDCoor Y
- LDCoor X
- Gira X
- Gira Y
- Gira Z
- SVCoor X
- SVCoor Y
- SVCoor Z
- SigPunto
- MOV DirCoord,DI
- POP DI
- RET
- @TSuperf@GiroInicial$qiiii ENDP
-
- @TSuperf@Dibujar$qpx5HDC__i PROC Hdc: WORD, Dir: WORD, @Self: DWORD
- PUBLIC @TSuperf@Dibujar$qpx5HDC__i
- PUSH SI
- PUSH DI
- MOV AX,DS
- MOV ES,AX
- LDS SI,@Self
- ADD SI,Variables
- MOV DI,OFFSET DatTmp
- MOV CX,(OFFSET Tmp-OFFSET DatTmp)/2
- CLD
- REP MOVSW
- MOV DS,AX
-
- CMP ErrorDat,0
- JNZ @@0
- CMP DatModif,0
- JZ @@1
- LES BX,@Self
- PUSH ES
- PUSH BX
- CALL @TSuperf@CalcCoord$qv
- OR AX,AX
- JZ @@1
- @@0: MOV AX,-1
- JMP @@5
- @@1: MOV AX,IntvGiro
- MUL Dir
- ADD AX,AngGiro
- MOV CX,360
- OR AX,AX
- @@2: JGE @@3
- ADD AX,CX
- JMP @@2
- @@3: CMP AX,CX
- JL @@4
- SUB AX,CX
- JMP @@3
- @@4: MOV AngGiro,AX
- LES BX,@Self
- MOV ES:[BX+OfsAngGiro],AX
- CalcAng AngGiro
-
- CALL MatGiro
- XOR DI,DI
- MOV SI,OFFSET PuntoX
- MOV AX,NodosX
- MOV ContX,AX
- CALL Dibujar
- MOV AX,AngGiro
- @@5: POP DI
- POP SI
- RET
- @TSuperf@Dibujar$qpx5HDC__i ENDP
-
- DibMalla PROC NEAR
- @@1: CALL Persp
- MOV [SI],CX
- MOV [SI+2],DX
- ADD SI,4
- DEC ContX
- JNS @@1
- @@2: MOV AX,NodosY
- MOV ContY,AX
- @@3: PUSH Hdc
- MOV SI,OFFSET PuntoX
- PUSH DS
- PUSH SI
- MOV AX,NodosX
- INC AX
- PUSH AX
- CALL POLYLINE
- DEC ContY
- JS @@5
- MOV AX,NodosX
- MOV ContX,AX
- @@4: CALL Persp
- PUSH Hdc
- PUSH CX
- PUSH DX
- PUSH Hdc
- XCHG CX,[SI]
- XCHG DX,[SI+2]
- PUSH CX
- PUSH DX
- CALL MOVETO
- CALL LINETO
- ADD SI,4
- DEC ContX
- JNS @@4
- JMP @@3
- @@5: RET
- DibMalla ENDP
-
- DibPuntos PROC NEAR
- XOR SI,SI
- @@1: MOV AX,NodosY
- MOV ContY,AX
- @@2: CALL Persp
- PUSH Hdc
- PUSH CX
- PUSH DX
- INC CX
- PUSH 0
- PUSH SI
- CALL SETPIXEL
- DEC ContY
- JNS @@2
- DEC ContX
- JNS @@1
- RET
- DibPuntos ENDP
-
- DibIntvX PROC NEAR
- @@1: CALL Persp
- MOV [SI],CX
- MOV [SI+2],DX
- ADD SI,4
- DEC ContX
- JNS @@1
- @@2: MOV AX,NodosY
- MOV ContY,AX
- @@3: PUSH Hdc
- MOV SI,OFFSET PuntoX
- PUSH DS
- PUSH SI
- MOV AX,NodosX
- INC AX
- PUSH AX
- CALL POLYLINE
- DEC ContY
- JS @@5
- MOV AX,NodosX
- MOV ContX,AX
- @@4: CALL Persp
- MOV [SI],CX
- MOV [SI+2],DX
- ADD SI,4
- DEC ContX
- JNS @@4
- JMP @@3
- @@5: RET
- DibIntvX ENDP
-
- DibIntvY PROC NEAR
- @@1: CALL Persp
- MOV [SI],CX
- MOV [SI+2],DX
- ADD SI,4
- DEC ContX
- JNS @@1
- @@2: MOV AX,NodosY
- MOV ContY,AX
- @@3: DEC ContY
- JS @@5
- MOV SI,OFFSET PuntoX
- MOV AX,NodosX
- MOV ContX,AX
- @@4: CALL Persp
- PUSH Hdc
- PUSH CX
- PUSH DX
- PUSH Hdc
- XCHG CX,[SI]
- XCHG DX,[SI+2]
- PUSH CX
- PUSH DX
- CALL MOVETO
- CALL LINETO
- ADD SI,4
- DEC ContX
- JNS @@4
- JMP @@3
- @@5: RET
- DibIntvY ENDP
-
- END
-